//
//  ViewController.swift
//  SwiftARC
//
//  Created by admin on 2021/11/3.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

//        test()
        
//        for _ in 0...999 {
//            DispatchQueue.global().async {
//                self.printInfo()
//            }
//        }
//
//        DispatchQueue.global().async (group: nil, qos: .default, flags: .barrier) {
//            print("barrier - async: \(Thread.current)")
//        }
        
        DispatchQueue.concurrentPerform(iterations: 999) { i in
            self.printInfo()
        }

     
    }
    
    func printInfo(){
        print(" >>>>>>>>>>>>>> \(Thread.current) ")
    }

}

// >>>>>>>>>>>>>>>> Object Life  >>>>>>>>>>,

//class Traveler {
//    var name: String = ""
//    var destination: String?
//
//    deinit {
//        print("Traveler deinit.....")
//    }
//}
//
//func test(){
//
//    let traveler1 = Traveler()         // traveler1 = 1
//
//    let traveler2 = traveler1          // traveler1 = 2 traveler2 = 1
//
//    // traveler1 release
//    traveler2.destination = "Big Sur" // traveler1 = 1 traveler2 = 1
//    // traveler2 release
//                                      //              traveler2 = 0
//
//    print("traveler1: ---- \(CFGetRetainCount(traveler1) - 1), traveler2:--- \(CFGetRetainCount(traveler2) - 1)")
//    print("Done .......")
//}


// >>>>>>>>>>>>>>>>>>> 循环引用 >>>>>>>>>>>>>>>>>>>>>>>>
//class Traveler {
//    var name: String
//
//     var account: Account?
//
//    init(name: String) {
//        self.name = name
//    }
//
//    func printSummary(){
//        if let account = account {
//            print("\(name) has \(account.points) points")
//        }
//    }
//
//    deinit {
//        print("Traveler deinit......")
//    }
//
//}
//class Account {
//
//    var traveler: Traveler
//    var points: Int = 0
//
//    init(traveler: Traveler, ponits: Int) {
//        self.traveler = traveler
//        self.points = ponits
//    }
//
//    deinit {
//        print("Account deinit......")
//    }
//}
//
//func test(){
//    let traveler = Traveler(name: "Lily")                   // traveler 1
//                                    //  traveler 2
//    let account = Account(traveler: traveler, ponits: 100) //  account 1
//
//    // account retain                                       // traveler 2, account 2
//    traveler.account = account
//
//    // account release                                      // traveler 2, account 1
//    traveler.printSummary()
//    // traveler  release                                    // traveler 1, account 1
//
//}



// >>>>>>>>>>>>>>>>>>>>>>>> weak >>>>>>>>>>>

//class Traveler {
//    var name: String
//
//    weak var account: Account?
//
//    init(name: String) {
//        self.name = name
//    }
//
//    func printSummary(){
//        print(">>>>>>>>> summary")
//    }
//
//    deinit {
//        print("Traveler deinit......")
//    }
//
//}
//class Account {
//
//    var traveler: Traveler
//    var points: Int = 0
//
//    init(traveler: Traveler, ponits: Int) {
//        self.traveler = traveler
//        self.points = ponits
//    }
//
//    deinit {
//        print("Account deinit......")
//    }
//}
//
//func test(){
//    let traveler = Traveler(name: "Lily")                           // traveler = 1
//     traveler retain
//    let account = Account(traveler: traveler, ponits: 100)          // traveler = 2, account = 1
//
//    traveler.account = account
      // account  release                                               // traveler = 2, account = 0
//    traveler.printSummary()
//
//   //  traveler release                                             // travler = 1, account = 0
//}


//class Traveler {
//    var name: String
//    var account: Account?
//
//    init(name: String) {
//        self.name = name
//    }
//}
//
//class Account {
//    weak var traveler: Traveler?
//    var points: Int = 0
//    init(traveler: Traveler, ponits: Int) {
//        self.traveler = traveler
//        self.points = ponits
//    }
//
//    func printSummary(){
//        if let traveler = traveler {
//            print("\(traveler.name) has \(points) points")
//        }
//    }
//
//
//    deinit {
//        print("Account deinit......")
//    }
//}
//
//
//func test(){
//    let travel = Traveler(name: "Lily")
//    let account = Account(traveler: travel, ponits: 100)
//
//    travel.account = account
//
//    account.printSummary()
//}
